双因素方差分析

如果要考虑两个因素对指标的影响,就要采用双因素方差分析。它的基本思想是:对每个因素各取几个水平,然后对各因素不同水平的每个组合作一次或若干次试验,对所得数据进行方差分析。对双因素方差分析可分为无重复和等重复试验两种情况,无重复试验只需检验两因素是否分别对指标有显著影响;而对等重复试验还要进一步检验两因素是否对指标有显著的交互影响。

数学模型

设 $A$ 取 $s$ 个水平 $A_{1}, A_{2}, \cdots, A_{s}, B$ 取 $r$ 个水平 $B_{1}, B_{2}, \cdots, B_{r}$, 在水平组合 $\left(B_{i}, A_{j}\right)$ 下总体 $X_{i j}$ 服从正态分布 $N\left(\mu_{i j}, \sigma^{2}\right), i=1, \cdots, r, j=1, \cdots, s$ 。又设在水 平组合 $\left(B_{i}, A_{j}\right)$ 下作了 $t$ 个试验, 所得结果记作 $X_{i j k}, X_{i j k}$ 服从 $N\left(\mu_{i j}, \sigma^{2}\right)$, $i=1, \cdots, r, j=1, \cdots, s, k=1, \cdots, t$, 且相互独立。将这些数据列成下表的形式。

将 $X_{i j k}$ 分解为 $$ X_{i j k}=\mu_{i j}+\varepsilon_{i j k}, \quad i=1, \cdots, r, \quad j=1, \cdots, s, k=1, \cdots, t, $$ 其中 $\varepsilon_{i j k} \sim N\left(0, \sigma^{2}\right)$, 且相互独立。记 $$ \begin{aligned} &\mu=\frac{1}{r s} \sum_{i=1}^{r} \sum_{j=1}^{s} \mu_{i j}, \quad \mu_{\bullet j}=\frac{1}{r} \sum_{i=1}^{r} \mu_{i j}, \quad \alpha_{j}=\mu_{\bullet j}-\mu, \\ &\mu_{i \bullet}=\frac{1}{s} \sum_{j=1}^{s} \mu_{i j}, \beta_{i}=\mu_{i \bullet}-\mu, \gamma_{i j}=\left(\mu_{i j}-\mu\right)-\alpha_{i}-\beta_{j}, \end{aligned} $$ $\mu$ 是总均值, $\alpha_{j}$ 是水平 $\boldsymbol{A}_{j}$ 对指标的效应, $\beta_{i}$ 是水平 $\boldsymbol{B}_{i}$ 对指标的效应, $\gamma_{i j}$ 是水 平 $B_{i}$ 与 $A_{j}$ 对指标的交互效应。

模型表为 $$ \left\{\begin{array}{l} X_{i j k}=\mu+\alpha_{j}+\beta_{i}+\gamma_{i j}+\varepsilon_{i j k}, \\ \sum_{j=1}^{s} \alpha_{j}=0, \sum_{i=1}^{r} \beta_{i}=0, \sum_{i=1}^{r} \gamma_{i j}=\sum_{j=1}^{s} \gamma_{i j}=0 \\ \varepsilon_{i j k} \sim N\left(0, \sigma^{2}\right), i=1, \cdots, r, j=1, \cdots, s, k=1, \cdots, t . \end{array}\right. $$

原假设为 $$ \begin{gathered} H_{01}: \alpha_{j}=0(j=1, \cdots, s), \\ H_{02}: \beta_{i}=0(i=1, \cdots, r), \\ H_{03}: \gamma_{i j}=0(i=1, \cdots, r ; j=1, \cdots, s) . \end{gathered} $$

无交互影响的双因素方差分析

如果根据经验或某种分析能够事先判定两因素之间没有交互影响,每组试验就不必重复, 即可令 $t=1$, 过程大为简化。 假设 $\gamma_{i j}=\mathbf{0}$,于是 $$ \mu_{i j}=\mu+\alpha_{j}+\beta_{i}, \quad i=1, \cdots, r, \quad j=1, \cdots, s, $$

此时, 模型可写成 $$ \left\{\begin{array}{l} X_{i j}=\mu+\alpha_{j}+\beta_{i}+\varepsilon_{i j} \\ \sum_{j=1}^{s} \alpha_{j}=\mathbf{0}, \sum_{i=1}^{r} \beta_{i}=\mathbf{0} \\ \varepsilon_{i j} \sim N\left(\mathbf{0}, \sigma^{2}\right), i=1, \cdots, r, j=1, \cdots, s . \end{array}\right. $$

下面采用与单因素方差分析模型类似的方法导出检验统计量。 记 $$ \bar{X}=\frac{1}{r s} \sum_{i=1}^{r} \sum_{j=1}^{s} X_{i j}, \bar{X}_{i \bullet}=\frac{1}{s} \sum_{j=1}^{s} X_{i j}, \bar{X}_{\bullet j}=\frac{1}{r} \sum_{i=1}^{r} X_{i j}, S_{T}=\sum_{i=1}^{r} \sum_{j=1}^{s}\left(X_{i j}-\bar{X}\right)^{2} \text {, } $$

其中 $S_{T}$ 为全部试验数据的总变差, 称为总平方和, 对其进行分解 $$ \boldsymbol{S}_{T}=\sum_{i=1}^{r} \sum_{j=1}^{s}\left(\boldsymbol{X}_{i j}-\overline{\boldsymbol{X}}\right)^{2} $$ $$ \begin{aligned} =\sum_{i=1}^{r} \sum_{j=1}^{s}\left(X_{i j}\right.&\left.-\bar{X}_{i \bullet}-\bar{X}_{\bullet j}+\bar{X}\right)^{2}+s \sum_{i=1}^{r}\left(\bar{X}_{i \bullet}-\bar{X}\right)^{2}+r \sum_{j=1}^{s}\left(\bar{X}_{\bullet j}-\bar{X}\right)^{2} \\ &=S_{E}+S_{A}+S_{B} \end{aligned} $$

可以验证, 在上述平方和分解中交叉项均为 0, 其中 $$ \begin{gathered} \boldsymbol{S}_{E}=\sum_{i=1}^{r} \sum_{j=1}^{s}\left(X_{i j}-\bar{X}_{i \bullet}-\bar{X} \overline{\boldsymbol{\vartheta}}_{\bullet j}+\bar{X}\right)^{2}, \\ S_{A}=r \sum_{j=1}^{s}\left(\bar{X}_{\bullet j}-\bar{X}\right)^{2}, \\ S_{B}=s \sum_{i=1}^{r}\left(\bar{X}_{i \bullet}-\bar{X}\right)^{2} . \end{gathered} $$

看看 $S_{A}$ 的统计意义。因为 $\bar{X}_{\bullet j}$ 是水平 $A_{j}$ 下所有观测值的平均, 所以 $\sum_{j=1}^{s}\left(\bar{X}_{\bullet j}-\bar{X}\right)^{2}$ 反映了 $\bar{X}_{\bullet 1}, \bar{X}_{\bullet 2}, \cdots, \bar{X}_{\bullet s}$ 差异的程度。这种差异是由于因素 $A$ 的不 同水平所引起的, 因此 $S_{A}$ 称为因素 $A$ 的平方和。类似地, $S_{B}$ 称为因素 $B$ 的平 方和。至于 $S_{E}$ 的意义不甚明显, 我们可以这样来理解: 因为 $S_{E}=S_{T}-S_{A}-S_{B}$ 在我们所考虑的两因素问题中, 除了因素 $A$ 和 $B$ 之外, 剩余的再没有其它系 统性因素的影响, 因此从总平方和中减去 $S_{A}$ 和 $S_{B}$ 之后, 剩下的数据变差只 能归入随机误差, 故 $S_{E}$ 反映了试验的随机误差。

有了总平方和的分解式 $S_{T}=S_{E}+S_{A}+S_{B}$, 以及各个平方和的统计意义 我们就可以明白, 假设的检验统计量应取为 $S_{A}$ 与 $S_{E}$ 的比。 和单因素方差分析相类似, 可以证明, 当 $H_{01}$ 成立时, $$ F_{A}=\frac{\frac{S_{A}}{s-1}}{\frac{S_{E}}{(r-1)(s-1)}} \sim F(s-1,(r-1)(s-1)), $$

当 $H_{02}$ 成立时, $$ F_{B}=\frac{\frac{S_{B}}{r-1}}{\frac{S_{E}}{(r-1)(s-1)}} \sim F(r-1,(r-1)(s-1)) $$ 检验规则为 $$ F_{A}<F_{\alpha}(s-1,(r-1)(s-1)) \text { 时接受 } H_{01} \text {, 否则拒绝 } H_{01} \text {; } $$ $F_{B}<F_{\alpha}(r-1,(r-1)(s-1))$ 时接受 $H_{02}$, 否则拒绝 $H_{02}$ 。

我们可以写出方差分布表:

关于交互效应的双因素方差分析

与前面方法类似, 记 $$ \begin{gathered} \bar{X}=\frac{1}{r s t} \sum_{i=1}^{r} \sum_{j=1}^{s} \sum_{k=1}^{t} X_{i j k}, \bar{X}_{i j \bullet}=\frac{1}{t} \sum_{k=1}^{t} X_{i j k}, \bar{X}_{i \bullet \bullet}=\frac{1}{s t} \sum_{j=1}^{s} \sum_{k=1}^{t} X_{i j k}, \\ \bar{X}_{\bullet j \bullet}=\frac{1}{r t} \sum_{i=1}^{r} \sum_{k=1}^{t} X_{i j k} . \end{gathered} $$ 将全体数据对 $\bar{X}$ 的偏差平方和 $$ \boldsymbol{S}_{T}=\sum_{i=1}^{r} \sum_{j=1}^{s} \sum_{k=1}^{t}\left(\boldsymbol{X}_{i j k}-\overline{\boldsymbol{X}}\right)^{2} $$

进行分解, 可得 $$ S_{T}=S_{E}+S_{A}+S_{B}+S_{A B} $$ 其中 $$ \begin{gathered} \boldsymbol{S}_{E}=\sum_{i=1}^{r} \sum_{j=1}^{s} \sum_{k=1}^{t}\left(\boldsymbol{X}_{i j k}-\bar{X}_{i j \cdot}\right)^{2}, \quad S_{A}=r t \sum_{j=1}^{s}\left(\bar{X}_{\bullet j \bullet}-\bar{X}\right)^{2}, \\ S_{B}=s t \sum_{i=1}^{r}\left(\bar{X}_{i \bullet \bullet}-\bar{X}\right)^{2}, \quad S_{A B}=t \sum_{i=1}^{r} \sum_{j=1}^{s}\left(\bar{X}_{i j \bullet}-\bar{X}_{i \bullet \bullet}-\bar{X}_{\bullet j \bullet}+\bar{X}\right)^{2} . \end{gathered} $$

称 $S_{E}$ 为误差平方和, $S_{A}$ 为因素 $A$ 的平方和(或列间平方和), $S_{B}$ 为因素 $B$ 的 平方和(或行间平方和), $S_{A B}$ 为交不作用的平方和(或格间平方和)。 可以证明,当 $\mathrm{H}_{03}$ 成立时 $$ F_{A B}=\frac{\frac{S_{A B}}{(r-1)(s-1)}}{\frac{S_{E}}{r s(t-1)}} \sim F((r-1)(s-1), r s(t-1)), $$ 据此统计量, 可以检验 $H_{03}$ 。

可以用 $F$ 检验法去检验诸假设。对于给定的显著性水平 $\alpha$, 检验的结论 为: 若 $F_{A}>F_{\alpha}(r-1, r s(t-1))$, 则拒绝 $H_{01}$; 若 $F_{B}>F_{\alpha}(s-1, r s(t-1))$, 则拒绝 $H_{02}$; 若 $F_{A B}>F_{\alpha}((r-1)(s-1), r s(t-1))$, 则拒绝 $H_{03}$, 即认为交互作用显著。 将试验数据按上述分析、计算的结果排成表 $4.16$ 的形式, 称为双因素方差 分析表。

statsmodels 实现

例 :下表 给出了某种化工过程在三种浓度、四种温度水平下得 率的数据。试在水平 $\alpha=0.05$ 下, 检验在不同温度(因素 $A$ )、不同浓度(因 素 B) 下的得率是否有显著差异?交互作用是否显著?

import numpy as np
import statsmodels.api as sm
y=np.array([[11, 11, 13, 10], [10, 11, 9, 12],
         [9, 10, 7, 6], [7, 8, 11, 10],
         [5, 13, 12, 14], [11, 14, 13, 10]]).flatten()
A=np.tile(np.arange(1,5),(6,1)).flatten()
B=np.tile(np.arange(1,4).reshape(3,1),(1,8)).flatten()
d={'x1':A,'x2':B,'y':y}
model = sm.formula.ols("y~C(x1)+C(x2)+C(x1):C(x2)",d).fit()  #注意交互作用公式的写法
anovat = sm.stats.anova_lm(model)  #进行双因素方差分析
print(anovat)

结果:

df sum_sq mean_sq F PR(>F)
C(x1) 3 19.125 6.375 1.33043 0.310404
C(x2) 2 40.0833 20.0417 4.18261 0.0418556
C(x1):C(x2) 6 18.25 3.04167 0.634783 0.701009
Residual 12 57.5 4.79167 nan nan

参考文献